[ Prev Page | Goto Content | NextPage ]
=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\=/=\
================================================================================ Подходы к централизованному управлению зараженными компьютерами, или "А нахрена трояны?!". ================================================================================ Здесь не будет никаких технических подробностей, кусков кода и дампов памяти. Это - просто размышления на отстраненные темы (в частности вирусы, черви, RAT и т.п.). Возможно в будущем (и это даже планируется) эти идеи будут реализованы.Но это в будущем. Сейчас же просто поразмышляем... 1. История Эх, куда ушло это золотое время злобных разборок в чате с криками "Я ТЯ ЩА НЮКНУ!!!", мощного флуда в IRC с диалапа и ночные шастания по сети в поисках нового боевого софта. Куда делись все те доверчивые пользователи, открывавшие каждый exe`шник в своем почтовом ящике и удивляющихся на глючность Windows 9x? Мда, были времена :) Время расцвета всевозможных троянов. Вспомните эти гордые названия: NetBus, DeepThroat, Naebi Coceda, Back Orifice... Люди, создававшие их, считались хакерами. Без них вся сетевая жизнь - ничто :) И что же сейчас? Да ничего впринципе и не изменилось. Умные люди продвинулись дальше в своих исследованиях и пишут софт уже другого рода. Злобные нюкеры переродились в скрипт киддисов и дефейсят сайты пачками. Все по-старому, все как всегда. Саморазмножающийся (и не только) софт тоже претерпел изменения и теперь никого не удивишь шифрованными троянами со встроенными дизасмами внутри. Но давайте по- порядку. 2. Общие принципы 2.1 Архитектура "Клиент/Сервер" Это классика. Все, что описано выше принадлежит данному классу. Первая, самая основательная архитектура, на котой по большому счету и построен весь Интернет. Основные принципы работы очень просты: имеются две программы клиент и сервер. Первая пользуется услугами второй. Сервер может предоставлять свои ресурсы как одному пользователю (т.н. последовательные серверы), так и многим ( т.н. параллельные серверы). Сервер запускается на удаленной машине и открывает порт (или несколько), которые прослушивает. Клиент коннектится на удаленный, заранее известный порт и адрес, и пользуется этими самыми услугами. Под услугами может пониматься все что угодно: от получения даты и времени удаленного компьютера, заканчивая полным управлением всей подсетью (это к примеру :). Что касается троянов - это фундамент, основа, от этого никак нельзя оторваться, т.к. в самом определении слова backdoor лежит эта архитектура. Чтобы получить доступ к удаленному компьютеру через сеть- нужны клиентская и серверная программа. И от этого никуда не уйдешь. 2.2 Централизованные сети Это уже несколько троянов коннектятся на определенный сервер. Пользователь имеет возможность управлять не одним, а несколькими компьютерами одновременно. Команды могут выполняться как определенной машиной, так и всей сетью (т.е. ассоциация с реально действующими протоколами). Все преимущества данной архитектуры на лицо. Возрастают доступные мощности, но и возрастает сложность реализации данного метода. Плюс - это то, что способы организации работы, управленияи обновления всей сети давно описаны и доступны всем желающим. Эти методы применяются в интернете на каждом шагу. Минусы - это уязвимость главного сервера. Если загнется он, загнется и вся сеть. Выходом может служить организация дополнительных центральных серверов, которые заменяют и дополняют основной. Но все-равно, нарушить работу данной сети очень и очень просто. 2.3 Децентрализованные сети Отстутствуют центральные серверы. Каждая машина коннектится с другими и обменивается доступной информацией с ними. Данный метод - реальность нашего времени. Его можно и нужно реализовывать,т.к. отказоустойчивость такой сети - наивысшая по сравнению с предыдущими. Основная проблема - это сама реализация. Лично я не видел реально рабочую сеть троянов, использующие такой метод разможения и обновления. Пользователь здесь выступает как участник и не более. Команды могут быть отданы любой известной зараженной машине, дальнейшая передача зависит от самой сети, ее пропускной способности и структуры. Все не так просто как может показаться на первый взгляд. Бэкдоры - начальный этап, который впоследствии развился (и продолжает развиваться) в более сложные вещи. Как сказал один человек: "Представление большинcтва программеров и юзеров о троянах далеко от реальности. Прогресс не стоит на месте ж)". Это основные принципы, на которых мы и будем строить нашу дальнейшую модель. Будем основываться на методе проектирования "по возрастающей",т.е. переходить от простого к сложному. 3. Задачи Для начала сформулируем основные задачи того, что в итоге хотим получить. А затем рассмотрим все подробнее. И конечно же будем стремиться к децентрализованности нашей маленькой незатейливой сеточки :) Итак, задача: построить сеть из подконтрольных компьютеров с возможностью дальнейшего управления данной системой.Пользователь данной сети, выступающий как в роли управляюще-создающего звена, так и в роли деструктивно настроенного элемента :) имеет полный контроль над каждой зараженной машиной. Сеть функционирует без определенной привязки, т.е. зараженные хосты сами находят друг друга и обмениваются доступной информацией. А теперь подробнее. 3.1 Заражение компьютера Заражение - одно из основных действий.Главное тут - скрытность.Может проходить по следующим сценариям: 1) Непосредственное заражение через EXE файл, т.е. запуск пришедшего по почте,скачанного,или еще как-то полученного сервера на компьютере жертвы. 2) Удаленное выполнение кода на компьютере жертвы (пример -это все известные на данный момент уязвимости Windows) Осуществление данной задачи - дело нехитрое. В первом случае играет роль человеческий фактор, а на помощь приходит огромный опыт рассылки спама. Второй способ - более оригинален и требует некоторых затрат на осуществление. Во-первых, это поиск уязвимых компьютеров в сети. Каждый зараженный компьютер должен искать в своей подсети доступные цели и осуществлять эксплоитинг. Тут может пригодиться технологии работы червей и т.п. вещей. Что касается локального заражения (т.е. когда троян закрепляется на определенном компьютере) - это фактически тот же вирусный код. Вообще вирмейкерство также не должно оставаться в стороне, т.к. в данном направлении сделаны большие успехи.Пермутирущий, системный процесс, да еще и никак невидимый - это уже кое-что :) 3.2 Поиск соседей и получение информации После того, как сервер основательно закрепитcя на компьютере-жертве, следующим шагом должно быть обнаружение ближайших соседей и получение дальнейшей информации от них.Информация - это местоположение данных соседей (привязка к IP, или целой подсети), получение и обновление базы уязвимостей (для дальнейшего распространения), информация об обновлениях плагинов и получение самих плагинов. Самое узкое место здесь - это поиск. Глупо перебирать все адреса до 255.255.255.255, поэтому должен быть какой-либо обоснованный алгоритм. Примером (но не реализацией :) может служить следующее: 1) Перебор по своей подсети 2) И далее по возрастающей/убывающей В итоге отбрасываем нежелательные адреса для проверки (те, на которых уж точно ничего не будет) и сокращаем время поиска по крайней мере вдвое. Также, никакой сервер не должен привязываться к определенному заранее порту, т.к. обнаружение данных портов - прямой путь к обнаружению всей сети и ее устранению. Случайное распределение портов между машинами - выход, но выход с БОЛЬШИМИ затратами. Подумайте, сколько времени потребуется для перебора всех возможных портов на каждом адресе подсети? Другим вариантом может служить зависимость номера порта от неких обстоятельств. IP адреса, имени машины, ...Любой способ подойдет. Но если данный алгоритм станет известен, станет известен и способ поиска зараженных машин. Что по определению нежелательно. Поэтому, следует выбирать "золотую середину". Порты назначаются в зависимости от алгоритма, описанного в одном из плагинов. Этот алгоритм меняется динамическим образом (или по требованию пользователя). В итоге получаем, что поиск сводится к обнаружению первой машины-соседа (путем перебора) и получения от нее плагина поиска. Дальнейшее распространение идет намного быстрее. 3.3 Поиск уязвимых машин Эта задача может быть решена двумя способами: 1) Во время поиска соседей (предыдущий пункт), каждая в сети машина проверяется на уязвимость. И в зависимости от проверки осуществляется,или не осуществляется заражение. 2) Данный этап выполняется только после выполнения предыдущего пункта (3.2). У каждого способа есть свои преимущества и недостатки.Рассмотрим их подробнее. Первый случай - прямой путь к эпидемии :) Если троян информирован о новейшей уязвимости, буквально каждая вторая машина - потенциальная жертва (это пример). НО! Размер самого трояна вырастает до невообразимых размеров: в себе нужно содержать множество плагинов (поиск, заражение, общение, ...) плюс самый новый вариант базы уязвимостей. В общем, полный набор. Второй случай более гуманный. По сети распространяется только маленький модуль с минимальным набором функций (поиск и заражение), и знающий лишь об ОДНОЙ уязвимости. Сам процесс остается более скрытым, да и не слишком-то мусорятся каналы связи. Выбор зависит от целей. Если требуется за минимальные сроки получить доступ к максимальному количеству машин - идеален (в определенных пределах конечно)первый вариант. Если же скорость распространения не важна, на помощь приходит второй вариант. Следует заметить, что сам процесс поиска базируется на поиске соседей (т.е. теоретически это одно и то же), поэтому совмещая оба пункта получаем общий Плагин поиска, на основе которого получаем Плагин поиска соседей и Плагин уязвимых машин.Это я к тому, что плагинность всей системы следует проектировать, опираясь на парадигму объектно-ориентированного программирования (в частности - наследование). Но об этом чуть позже. 3.4 Общение с соседями Первоначально, для только что зараженной машины, общение представляет собой обмен информацией с найденным соседом о других компьютерах, получение плагинов для дальнейшей работы и обновление своей БД уязвимостей. Например, общение может выглядеть таким образом: 1) Машина А, найдя своего соседа, спрашивает ее о новом алгоритме поиска (получение нового плагина). 2) Машина Б проверяет, есть ли у нее такой плагин (ведь она тоже может быть только что заражена и не иметь последних версий). Если у нее его не оказалось, Б может спросить плагин у своих соседей и так по цепочке. 3) Получив нужный код, машина А просит сообщить ей проверенные адреса и адреса найденных машин. 4) Обновив свою базу адресов, машина А просит передать ей новую версию базы уязвимостей. 5) Выполнив все предыдущие пункты, машина А является полноправным членом зараженной сети и может сама приступать к поиску и заражению новых компьютеров. Машина Б так же может обращаться за помощью к своим соседям для получения и обновления своих БД. В идеале получаем некое подобие графа, где рано или поздно требуемая информация будет получена. Так же общение может представлять собой передачу сообщений как от пользователя, так и некую системную информацию. Пользователь как владелец данной сети может отдавать команды или определенной машине, или всей системе в целом. Сообщения выбранному компьютеру доставляются на основе алгоритмов действующих в интернете сетей (Ethernet и Token Ring допустим),т.е. передается последовательно каждому компьютеру до тех пор, пока не достигнет адресата. Групповые сообщения выполняются всеми без исключения (но процесс передачи такой же, как и в случае с одной машиной). Системная информация - это команда на добавление новой уязвимости, добавление/ обновление плагина и прочее. 3.5 Остальное Под остальным понимается любое действие, которое предусмотрено определенным плагином и направлено на взамодействие с сетью. Варианты действий ограничивает только фантазия :) 4. Плагины 4.1 Структура программы-сервера Чтобы иметь возможность добавлять/обновлять/удалять плагины из трояна, должна существовать некая общая структура для всех, кто будет пользоваться данной сетью и захочет изменять ее свойства и назначение. Сам троян может иметь различные варианты реализации данной идеи, но общую сущность соблюдать обязан. Поясним на примере: 1) Троянская программа имеет вид "все в себе", т.е. все модули (читай - плагины)вшиты внутрь EXE-файла,а обновляется сама программа и ничего более. Может быть такого вида: ------------------- Загрузчик плагинов ------------------- | ------------------- Плагин 1 ------------------- | ------------------- Плагин 2 ------------------- | ... | ------------------- Плагин N ------------------- | ------------------- Хост-программа ------------------- Где: Загрузчик плагинов - универсальный модуль, который занимается тем, что загружает в память, управляет выполнением (распараллеливает работу, обрабатывает ошибки и т.п.), добавляет и удаляет плагины и др. Плагин 1..N - сами плагины Хост-программа - необязательно должно присутствовать. Существует, если троян содержится в другой программе (вирус). 2) Троянская программа содержится отдельно от всех плагинов, т.е. есть загрузчик плагинов, а все дополнительные модули содержатся в отдельных файлах (разбросанных или нет по компьютеру). Первый вариант позволяет не заботиться о сохранности всех модулей, т.к. они находятся под рукой. Также этот вариант позволяет с успехом применять все известные вирусные технологии, т.е. программа одна и больше ни о чем думать не надо. Второй вариант позволяет больше оставаться незамеченным на компьютере жертвы, потому что троянская программа никак себя не проявляет. Модули могут быть разбросаны по системе как в отдельных файлах (т.е. в одном файле - один плагин), так и сожержаться в хост-программах. 4.2 Структура плагина Также следует разработать единую структуру плагина. Это позволит каждому человеку, знакомого с данной сетью и ее особенностями, создавать плагины для своих нужд. Лично мне на ум приходит только единственное решение (действует только в виндах): Каждый плагин - это только код и данные, содержащиеся в одной секции. Никаких заголовков, таблиц импорта/экспорта и подобной хрени. Весь код использует только системные API и ничего более. Чтобы вызвать определенную функцию, нужно передать ее имя и параметры в Загрузчик плагинов (предположительно), который ее вызовет и вернет значение. Таким образом получаем: 1) Загрузчик плагинов настраивает функцию для вызова API системы(находит ядро, разбирает заголовок, находит адрес api GetProcAddress... в общем - стандартная процедура) 2) Остальные настройки 3) Загружается первый плагин, и ему отдается управление ... n) Загружается n-ый плагин, и ему отдается управление n+1) Все остальное У каждого плагина есть своя, заранее определенная структура, описывающая его действия (предположительно находится или в самом начале, или в том месте, где начинаются данные). Она может описывать как общие действия для работы плагина (например, загружать ли его отдельным тредом), так и некие специфические его свойства (например, адреса памяти, которые могут потребоваться). 4.3 Распространение плагинов по сети При появлении нового плагина у пользователя, встает вопрос о его распространении внутри зараженной сети. Эта проблема может быть решена, основываясь на описаниях команд пункта 3.4: 1) Пользователь посылает команду всей сети (или только определенной машине) добавить, заменить, или удалить модуль в троянской программе. 2) Хост, получивший данную команду, ее выполняет и отдает управление Загрузчику плагинов, который делает нужные для этого поправки. Все вроде бы просто и не требует пояснений. Замечу, что добавление новой уязвимости в БД - это схожий (если не эквивалентный) процесс. 5. Выводы Действующий MyDoom показал незащищенность интернета как целого, и всех компьютеров как отдельных частей. Реализацию данной задачи не следует рассматривать как нечто из области фантастики. Описанная система есть плод моего больного воображения,поэтому прошу сильно не пинать за неточности, глупости и ошибки =) Все это еще на стадии альфа-бета-зю проектирования, поэтому говорить о конкретной реализации не приходится. Вообще, если приглядеться повнимательнее,то это уже реализовано и по многу раз. Только используется все это добро для других целей :) Примерами могут служить сам интернет, пиринговые сети, все действующие протоколы и многое-многое другое.Остается только соединить все эти знания в одну налаженную Систему - и, как говорится, вуаля! Хочу обратиться ко всем, кто дочитал до этого места, а главное заинтересовался всем вышеописанным. Большие дела мы можем делать только вместе, поэтому заканчивайте обливать говном друг друга в форумах, кидать понты в IRC и заниматься прочей ерундой.Если вы,кричащие о несостоятельности российской сцены, способны не только говорить на эту тему - тогда стоит заняться чем-то реальным. Я не говорю, что все то, о чем я рассказал - стоящий проект. Но начинать все- равно с чего-то придется. Я никого не заставляю, не хочу участвовать в спорах на эту тему и т.п. Если есть желание и возможности - велкам. С удовольствием выслушаю все предложения. dzen ([email protected]) [ Prev Page | Goto Content | NextPage ]